home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-28 | 7.4 KB | 366 lines | [TEXT/MPS ] |
- /*
- File: NewDelete.cp
-
- Copyright: © 1991-1994 by Apple Computer, Inc.
- All rights reserved.
-
- Part of the AOCE Sample SMSAM Package. Consult the license
- which came with this software for your specific legal rights.
-
- */
-
-
-
- #pragma trace off
-
- #ifndef __NEWDELETE__
- #include "NewDelete.h"
- #endif
-
- #ifndef __NEW__
- #include <New.h>
- #endif
-
- #ifndef __STDARG__
- #include "StdArg.h"
- #endif
-
- #ifndef __STDIO__
- #include "StdIO.h"
- #endif
-
- #ifndef __DEBUGGINGGEAR__
- #include "DebuggingGear.h"
- #endif
-
- #ifndef __DEBUGCONSTANTS__
- #include "DebugConstants.h"
- #endif
-
- #ifndef __THREAD_H
- // #include "Thread.h"
- #endif
-
- #ifndef __STDARG__
- #include "StdArg.h"
- #endif
-
- #ifndef __DEBUGASSERT__
- #include "DebugAssert.h"
- #endif
-
- #ifndef __HANDLEOBJECT__
- #include "HandleObject.h"
- #endif
-
- #pragma segment Main
-
- #ifndef THINK_CPLUS
- // Think C++ can't handle multiple defns of a function.
- void* operator new ( size_t size ) { return ::AllocatePtr ( size ); }
- void operator delete ( void* p ) { ::DisposeIfPtr ( (Ptr) p ); }
- #endif
-
- #ifndef THINK_CPLUS
-
- void* TDirectObject::operator new ( size_t size ) { return ::AllocatePtr ( size ); }
- void TDirectObject::operator delete ( void* h ) { ::DisposeIfHandle ( (Handle) h ); }
-
- void** HandleObject::operator new ( size_t size ) { return ::AllocateHandle ( size ); }
- void HandleObject::operator delete ( void** h ) { ::DisposeIfHandle ( (Handle) h ); }
- void** THandleObject::operator new ( size_t size ) { return ::AllocateHandle ( size ); }
- void THandleObject::operator delete ( void** h ) { ::DisposeIfHandle ( (Handle) h ); }
-
- #else
-
- void* TDirectObject::operator new ( size_t size ) { return ::AllocatePtr ( size ); }
- void TDirectObject::operator delete ( void* h ) { ::DisposeIfPtr ( (Ptr) h ); }
-
- #endif
-
- extern void Register ( const void*, const char* file, unsigned long line );
- extern void Unregister ( const void* );
-
- /***********************************|****************************************/
-
- static void ReportError ( const char* format, ... )
- {
- char buffer [ 128 ];
- va_list val; va_start ( val, format );
- buffer [ 0 ] = ::vsprintf ( buffer + 1, format, val );
-
- #if debug
- if ( chrisFlag.Flag ( kCallMacsbugOnMemErr ) )
- #endif
- ::DebugStr ( (const StringPtr) buffer );
- #if debug
- else
- chris << buffer << endl;
- #endif
- }
-
- /***********************************|****************************************/
-
- void* BLJFailIfNil ( const void* p, const char* file, unsigned long line )
- {
- #if debug
-
- if ( !p )
- {
- keith << "FAILIFNIL: file " << file << ", line " << line << endl;
- FAILOSErr ( -666 );
- }
-
- #else
-
- ::ReportError ( "FAILED: nil pointer; file %s, line %li", file, line );
-
- #endif
-
- return (void*) p;
- }
-
- /***********************************|****************************************/
-
- Boolean ValidPtr ( const Ptr p )
- {
- Boolean result = true;
-
- // A pointer can't be odd.
- if ((unsigned long) p & 1)
- result = false;
-
- // A pointer can't be 'below' the system heap (in low memory)
- if (p <= (Ptr) SystemZone())
- result = false;
-
- // A pointer CAN be inside the system heap
- if ((p >= (Ptr) SystemZone()) && (p <= SystemZone()->bkLim))
- {
- result = true;
- }
- else if ((p >= (Ptr) ApplicZone()) && (p <= ApplicZone()->bkLim))
- {
- result = true;
- }
- else
- {
- result = false;
- }
-
- #if debug
- if (!result)
- {
- keith << "ValidPtr(" << (long) p << " given bad pointer." << endl;
- }
- #endif
-
- return result;
- }
-
- /***********************************|****************************************/
-
- Boolean ValidHandle ( const Handle h )
- {
- if ( ::ValidPtr ( (const Ptr) h ) )
- return ::ValidPtr ( *h );
-
- return false;
- }
-
- /***********************************|****************************************/
-
- Boolean DisposeIfPtr ( Ptr p )
- {
- if ( p != nil )
- ::DeallocatePtr ( p );
-
- return true;
- }
-
- /***********************************|****************************************/
-
- Boolean DisposeIfHandle ( Handle h )
- {
- if ( h != nil )
- ::DeallocateHandle ( h );
-
- return true;
- }
-
- /***********************************|****************************************/
-
- void SetNewHandler ()
- {
- }
-
- /***********************************|****************************************/
- /***********************************|****************************************/
-
- #if debug
-
- // NOTE: the non-debug versions are implemented in NewDelete.h
-
- Ptr AllocatePtr ( unsigned long bytes, Boolean clear, Boolean fail, const char* file, unsigned long line )
- {
- if ( bytes > maxSize )
- {
- ::ReportError ( "AllocatePtr::Warning: size = %li", bytes );
- bytes = 1;
- }
- else if ( bytes < 0 )
- {
- ::ReportError ( "AllocatePtr::Warning, size = %li", bytes );
- bytes = 0;
- }
-
- Ptr p = clear ? ::NewPtrClear ( bytes ) : ::NewPtr ( bytes );
-
- if ( !p )
- {
- ::ReportError ( "Error: Ptr = %p, MemErr = %i, size = %li", p, MemError (), bytes );
-
- if ( fail )
- BLJFailIfNil ( p, file, line );
- }
- else if ( !clear )
- {
- ::memset ( p, 0xFF, (unsigned int) bytes );
- }
-
- if ( chrisFlag.Flag ( 9 ) )
- Register ( p, file, line );
-
- return p;
- }
-
- /***********************************|****************************************/
-
- Handle AllocateHandle ( unsigned long bytes, Boolean clear, Boolean fail, const char* file, unsigned long line )
- {
- if ( bytes > maxSize )
- {
- ::ReportError ( "AllocateHandle::Warning: size = %li", bytes );
- bytes = 1;
- }
-
- Handle h = clear ? ::NewHandleClear ( bytes ) : ::NewHandle ( bytes );
-
- if ( !h )
- {
- ::ReportError ( "Error: Handle = %p, MemErr = %i, size = %li", h, MemError (), bytes );
-
- if ( fail )
- BLJFailIfNil ( h, file, line );
- }
- else if ( !clear )
- {
- ::HLock ( h );
- ::memset ( *h, 0xFF, (unsigned int) bytes );
- ::HUnlock ( h );
- }
-
- if ( chrisFlag.Flag ( 9 ) )
- Register ( h, file, line );
-
- return h;
- }
-
- /***********************************|****************************************/
-
- void DeallocatePtr ( Ptr p )
- {
- if (!p)
- return;
-
- Size bytes = ::GetPtrSize ( p );
- OSErr error = MemError ();
-
- if ( error != noErr )
- {
- ::ReportError ( "Error: Ptr = %p, MemErr = %i, size = %li", p, error, bytes );
- return;
- }
-
- Unregister ( p );
- ::memset ( p, 0xFF, (unsigned int) bytes );
- ::DisposePtr ( p );
- error = MemError ();
-
- if ( error != noErr )
- {
- ::ReportError ( "Error: Ptr = %p, MemErr = %i", p, error );
- }
- }
-
- /***********************************|****************************************/
-
- void DeallocateHandle ( Handle h )
- {
- if (!h)
- return;
-
- Size bytes = ::GetHandleSize ( h );
- OSErr error = MemError ();
-
- if ( error != noErr )
- {
- ::ReportError ( "Error: Handle = %p, MemErr = %i, size = %li", h, error, bytes );
- }
- else
- {
- Unregister ( h );
- ::HLock ( h );
- ::memset ( *h, 0xFF, (unsigned int) bytes );
- ::HUnlock ( h );
- ::DisposeHandle ( h );
- error = MemError ();
-
- if ( error != noErr )
- {
- ::ReportError ( "Error: Handle = %p, MemErr = %i", h, error );
- }
- }
- }
-
- #endif // debug
-
- /***********************************|****************************************/
-
- void* operator new ( size_t size, const void* placement )
- {
- void* p = nil;
-
- if ( placement == SystemZone () )
- {
- p = ::NewPtrSys ( size );
- }
- else if ( placement == ApplicationZone () )
- {
- p = ::NewPtr ( size );
- }
- else
- {
- Zone* z = ::PtrZone ( (Ptr) placement );
-
- if ( !z || MemError () )
- {
- p = ::NewPtr ( size );
- }
- else
- {
- Zone* saved = GetZone ();
- ::SetZone ( z );
- p = ::NewPtr ( size );
- ::SetZone ( saved );
- }
- }
-
- if ( !p )
- ::ReportError ( "Error: Ptr = %p, MemErr = %i, size = %li", p, MemError (), size );
-
- return p;
- }
-
- /***********************************|****************************************/
-